/**
 * Created by zoushuiyun on 2016/12/26.
 */
import { Pipe, PipeTransform } from '@angular/core';
import {isNullOrUndefined} from "util";
import {groupOption, sexOption, userStatusOption, yesNoOption} from "../../constant/dictionary";


/**
 * 性别，从 dictionary 查找
 * one to one
 */
@Pipe({name: 'sexPipe'})
export class SexPipe implements PipeTransform {
  constructor() {}
  transform(value: number): string {
    let result = "";
    let sexDicts:any[]  = sexOption;
    for (let sex of sexDicts) {
      if(sex.key==value){
        result = sex.value;
        break;
      }
    }
    return result;
  }
}

/**
 * 1是0否状态，从 dictionary 查找
 * one to one
 */
@Pipe({name: 'yesNoPipe'})
export class YesNoPipe implements PipeTransform {
  constructor(){}
  transform(value: number): string {
    let result = "";
    let yesNoDicts:any[]  = yesNoOption;
    for (let o of yesNoDicts) {
      if(o.key==value){
        result = o.value;
        break;
      }
    }
    return result;
  }
}
/**
 * 用户状态，从 dictionary 查找
 * one to one
 */
@Pipe({name: 'userStatusPipe'})
export class UserStatusPipe implements PipeTransform {
  constructor(){}
  transform(value: number): string {
    let result = "";
    let userDicts:any[]  = userStatusOption;
    for (let user of userDicts) {
      if(user.key==value){
        result = user.value;
        break;
      }
    }
    return result;
  }
}
/**
 * 用户类型，从 dictionary 查找
 * one to one
 */
@Pipe({name: 'userGroupPipe'})
export class UserGroupPipe implements PipeTransform {
  constructor(){}
  transform(value: number): string {
    let result = "";
    let groupDicts:any[]  = groupOption;
    for (let user of groupDicts) {
      if(user.key==value){
        result = user.value;
        break;
      }
    }
    return result;
  }
}
/**
 *  后台获取的字典 翻译器
 *
 *
 *  one to one
 */
@Pipe({name: 'dicsNamePipe'})
export class DicsNamePipe implements PipeTransform {
  constructor(){}
  transform(value: string,groupDicts:any[] ): string {
    let result = "";
    for (let obj of groupDicts) {
      if(obj.value==value){
        result = obj.desc;
        break;
      }
    }
    return result;
  }
}
// /**
//  * 平台帐号名称，从cacheService查找
//  * one to one
//  */
// @Pipe({name: 'accountNamePipe'})
// export class AccountNamePipe implements PipeTransform {
//   constructor(private cacheService:CacheService){}
//   transform(value: number): string {
//     let accountDicts  = this.cacheService.getBusFlowDefineNodes()
//     if(isNullOrUndefined(accountDicts)){
//       return ""
//     }
//     return accountDicts[value]
//   }
// }

/**
 * 字符串截取
 */
@Pipe({name: 'stringCutPipe'})
export class StringCutPipe implements PipeTransform {
  constructor(){}
  transform(value: string,args:number ): string {
    if(isNullOrUndefined(value)){
      return ""
    }
    if(value.length <= args) {
      return value;
    }else{
      return value.substring(0,args) ;
    }

  }
}

/**
 * 字符串截取 带。。。
 */
@Pipe({name: 'stringEllipsisCutPipe'})
export class stringEllipsisCutPipe implements PipeTransform {
  constructor(){}
  transform(value: string,args:number ): string {
    if(isNullOrUndefined(value)){
      return ""
    }
    if(value.length <= args) {
      return value;
    }else{
      return value.substring(0,args)+"..." ;
    }

  }
}
/**
 * 将arr中selected为true的元素排在前面 ---可自行扩展
 */
@Pipe({name: "selectedPipe",pure:false})
export class SelectedPipe {
  transform(array: Array<any>, args: string): Array<any> {
    let result:Array<any>=new Array
    array.forEach((arr)=>{
      if(arr.selected){
        result.push(arr)
      }
    })
    array.forEach((arr)=>{
      if(!arr.selected){
        result.push(arr)
      }
    })
    return result;
  }
}



/*
然后在组件的模板文件中使用即可 {{ birthday | date:'medium' | trimSpace}} ：

<p> Without Pipe: Today is {{ birthday }} </p>
<p> With Pipe: Today is {{ birthday | date:"MM/dd/yy" }} </p>
<p>The time is {{ birthday | date:'shortTime' }}</p>
<p>The time is {{ birthday | date:'medium' | trimSpace}} with trim space pipe applied</p>
<p>The time is {{ birthday | date:'medium' | uppercase }}</p>
打开浏览器看一下效果，我们看到应用了trimSpace管道的日期的空格被移除了，如图所示：

自定义一个移除空格的Pipe

内建的Pipe

Decimal Pipe

DatePipe和UpperCase Pipe我们刚刚已经见识过了，现在我们看一看内建的其他Pipe。首先是用于数字格式化的DecimalPipe。DecimalPipe的参数是以 {minIntegerDigits}.{minFractionDigits}-{maxFractionDigits} 的表达式形式体现的。其中：

minIntegerDigits 是最小的整数位数，默认是1。
minFractionDigits 表示最小的小数位数，默认是0。
maxFractionDigits 表示最大的小数位数，默认是3。
<p>pi (no formatting): {{pi}}</p>
<p>pi (.5-5): {{pi | number:'.5-5'}}</p>
<p>pi (2.10-10): {{pi | number:'2.10-10'}}</p>
<p>pi (.3-3): {{pi | number:'.3-3'}}</p>
如果我们在组件中定义 pi: number = 3.1415927; 的话，上面的数字会被格式化成下图的样子

Decimal Pipe用于数字的格式化

Currency Pipe

顾名思义，这个Pipe是格式化货币的，这个Pipe的表达式形式是这样的： currency[:currencyCode[:symbolDisplay[:digitInfo]]]，也就是说在currency管道后用分号分隔不同的属性设置：

<p>A in USD: {{a | currency:'USD':true}}</p>
<p>B in CNY: {{b | currency:'CNY':false:'4.2-2'}}</p>
上面的代码中 USD或 CNY 表面货币代码，true 或 false 表明是否使用该货币的默认符号，后面如果再有一个表达式就是规定货币的位数限制。这个限制的具体规则和上面Decimal Pipe的类似，如下图所示。

Currecy Pipe用于格式化货币

Percent Pipe

这个管道当然就是用来格式化百分数的，百分数的整数位和小数位的规则也和上面提到的Decimal Pipe和Currency Pipe一致。如果在组件中定义 myNum: number = 0.1415927; 下面的代码会输出成下图的样子：

<p>myNum : {{myNum | percent}}</p>
<p>myNum (3.2-2) : {{myNum | percent:'3.2-2'}}</p>
Percent Pipe用来格式化百分数

Json Pipe

这个管道个人感觉更适合在调试中使用，它可以把任何对象格式化成JSON格式输出。如果我们在组件中定义了一个对象：

object: Object = {
  foo: 'bar',
  baz: 'qux',
  nested: {
    xyz: 3,
    numbers: [1, 2, 3, 4, 5]
  }
};
那么下面的模板会输出下图的样子，在调试阶段，这个特性很好帮助你输出可读性很强的对象格式。当然如果你使用了现代化的IDE，这么使用的意义就不是很大了：

<div>
  <p>Without JSON pipe:</p>
<pre>{{object}}</pre>
<p>With JSON pipe:</p>
<pre>{{object | json}}</pre>
</div>
Json Pipe用于以Json形式格式化对象*/
